home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Online / opennap / usermode.c < prev    next >
C/C++ Source or Header  |  2001-06-08  |  3KB  |  140 lines

  1. /* Copyright (C) 2000-1 edwards@bitchx.dimension6.com
  2.    This is free software distributed under the terms of the
  3.    GNU Public License.  See the file COPYING for details.
  4.  
  5.    $Id: usermode.c,v 1.20 2001/02/15 08:39:45 drscholl Exp $ */
  6.  
  7. /*
  8.  * written by Colten Edwards.
  9.  */
  10.  
  11. #include <string.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include "opennap.h"
  15. #include "debug.h"
  16.  
  17. static char *User_Levels[] = { "ERROR", "BAN", "CHANGE",
  18.     "KILL", "LEVEL", "SERVER", "MUZZLE", "PORT", "WALLOP", "CLOAK",
  19.     "FLOOD", "PING", "MSG", "WHOIS", ""
  20. };
  21.  
  22. unsigned int UserMode_int = LOGALL_MODE;
  23. char   *UserMode;
  24.  
  25.  
  26. unsigned int
  27. set_usermode (char *mode, unsigned int level)
  28. {
  29.     char   *av;
  30.     int     neg = 0;
  31.     int     i, p;
  32.  
  33.     while ((av = next_arg (&mode)))
  34.     {
  35.     if (!strcasecmp (av, "ALL"))
  36.         level = LOGALL_MODE;
  37.     else if (!strcasecmp (av, "NONE"))
  38.         level = 0;
  39.     else if (*av == '-')
  40.     {
  41.         neg = 1;
  42.         av++;
  43.     }
  44.     else
  45.         neg = 0;
  46.     for (i = 0, p = 1; *User_Levels[i]; i++, p <<= 1)
  47.     {
  48.         if (!strcasecmp (av, User_Levels[i]))
  49.         {
  50.         if (neg)
  51.             level &= (LOGALL_MODE ^ p);
  52.         else
  53.             level |= p;
  54.         break;
  55.         }
  56.     }
  57.     }
  58.     return level;
  59. }
  60.  
  61. void
  62. config_user_level (char *mode)
  63. {
  64.     unsigned int level = UserMode_int;
  65.     int     i, buflen, p;
  66.     char    buffer[300];
  67.  
  68.     if (!mode)
  69.     {
  70.     UserMode_int = LOGALL_MODE;
  71.     UserMode = STRDUP ("ALL");
  72.     return;
  73.     }
  74.     level = set_usermode (mode, UserMode_int);
  75.     if (level == 0 || level == LOGALL_MODE)
  76.     {
  77.     UserMode_int = level;
  78.     FREE (UserMode);
  79.     UserMode = STRDUP (level == 0 ? "NONE" : "ALL");
  80.     return;
  81.     }
  82.     buffer[0] = 0;
  83.     for (i = 0, p = 1; *User_Levels[i]; i++, p <<= 1)
  84.     {
  85.     if (level & p)
  86.     {
  87.         buflen = strlen (buffer);
  88.         snprintf (buffer + buflen, sizeof (buffer) - buflen,
  89.               "%s%s", buflen > 0 ? " " : "", User_Levels[i]);
  90.     }
  91.     }
  92.     FREE (UserMode);
  93.     UserMode = STRDUP (buffer);
  94.     UserMode_int = level;
  95. }
  96.  
  97. /* 10203 [mode] */
  98. HANDLER (user_mode_cmd)
  99. {
  100.     USER   *sender;
  101.     int     i, p;
  102.     unsigned int level = 0;
  103.     char   *sender_name;
  104.  
  105.     (void) tag;
  106.     (void) len;
  107.     CHECK_USER_CLASS ("user_mode");
  108.     ASSERT (validate_connection (con));
  109.     if (pop_user_server (con, tag, &pkt, &sender_name, &sender))
  110.     return;
  111.     if (!pkt || !*pkt)
  112.     {
  113.     char    buffer[250];
  114.     int     buflen;
  115.  
  116.     if (sender->con->uopt->usermode == 0)
  117.         strcpy (buffer, "NONE");
  118.     else
  119.     {
  120.         buffer[0] = 0;
  121.         for (i = 0, p = 1; *User_Levels[i]; i++, p <<= 1)
  122.         {
  123.         if (sender->con->uopt->usermode & p)
  124.         {
  125.             buflen = strlen (buffer);
  126.             snprintf (buffer + buflen, sizeof (buffer) - buflen,
  127.                    "%s%s", buflen > 0 ? " " : "",
  128.                    User_Levels[i]);
  129.         }
  130.         }
  131.     }
  132.     send_cmd (con, MSG_SERVER_USER_MODE, "%s", buffer);
  133.     return;
  134.     }
  135.  
  136.     level = set_usermode (pkt, con->uopt->usermode);
  137.     if (sender->con->uopt->usermode != level)
  138.     sender->con->uopt->usermode = level;
  139. }
  140.